package com.smart.face.service;

import com.baidu.aip.face.AipFace;
import com.baidu.aip.util.Base64Util;
import org.json.JSONObject;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import org.json.JSONArray;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;


/**
 * 作者: JinMenglong
 * 描述:
 * 日期: Create in 2021-01-08 16:06
 * 修改人:
 * 最后一次修改时间:
 */
@Service
public class FaceService {
    @Resource
    private AipFace aipFace;

    /**
     * 人脸检测
     * @param faceMap
     * @return
     */
    public Map<String,Object> faceDetect(Map faceMap) {
//    public Map<String,Object> faceDetect(Map faceMap) {

        HashMap<String, String> options = new HashMap<String, String>();
        options.put("face_field", "age,face_shape,gender");
        options.put("max_face_num", "1");
        options.put("face_type", "LIVE");
        options.put("liveness_control", "LOW");

        String image = (String) faceMap.get("image");
        String imageType = "BASE64";

        JSONObject res = aipFace.detect(image, imageType, options);
        System.out.println(res.toString(2));
        return res.toMap();
//        return JSON.parseObject(res.toString(2),Map.class);
    }




    /**
     * 人脸搜索
     *
     * @param
     * @param file
     * @return {@link String}
     * @author jinMengLong
     * @date 2021/1/8 16:15:28
     */
    public Map<String, Object> search(MultipartFile file) throws IOException {
        HashMap<String, String> options = new HashMap<String, String>();
        //最多检测的人脸数,按照片中 面积最大的人脸
        options.put("max_face_num", "1");
        options.put("match_threshold", "70");//匹配的阈值，低于此值的用户不会被返回
        /*
            图片质量控制
            NONE: 不进行控制
            LOW:较低的质量要求
            NORMAL: 一般的质量要求
            HIGH: 较高的质量要求
            默认 NONE
         */
        options.put("quality_control", "LOW");
        /*
          活体检测控制
          NONE: 不进行控制
          LOW:较低的活体要求(高通过率 低攻击拒绝率)
          NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率)
          HIGH: 较高的活体要求(高攻击拒绝率 低通过率)
          默认NONE
         */
        options.put("liveness_control", "NORMAL");
        options.put("max_user_num", "1");//返回的用户数，按匹配得分排序，
        byte[] bytes = file.getBytes();
        String image = Base64Util.encode(bytes);
        String imageType = "BASE64";
        String groupIdList = "group3";

        JSONObject search = aipFace.search(image, imageType, groupIdList, options);
        System.out.println(search);

        if (search.get("error_code").equals("0")) {
            JSONObject result = (JSONObject) search.get("result");
            JSONArray user_list = (JSONArray) result.get("user_list");
            JSONObject faceMap = (JSONObject) user_list.get(0);
            faceMap.append("result", "SUCCESS");
            return faceMap.toMap();
        } else {
            Map<String, Object> resultMap = new HashMap<String, Object>();
            resultMap.put("result", "FAIL");
            return resultMap;
        }
        //获取返回的所有用户列表，因上面只返回一个
    }

}
